#ifdef GL_ES
// 设置浮点数精度为中等精度，优化性能和质量平衡
precision mediump float;
#endif

// 统一变量：屏幕分辨率
uniform vec2 u_resolution;
// 统一变量：鼠标位置
uniform vec2 u_mouse;
// 统一变量：时间变量，用于动画效果
uniform float u_time;

/**
 * 调色板函数，根据输入参数生成颜色
 * @param t 时间或位置参数，用于生成颜色变化
 * @return 生成的RGB颜色向量
 */
vec3 palette( float t ) {
    // 基础颜色分量
    vec3 a = vec3(0.5, 0.5, 0.5);
    vec3 b = vec3(0.5, 0.5, 0.5);
    vec3 c = vec3(1.0, 1.0, 1.0);
    // 颜色偏移量，决定主色调
    vec3 d = vec3(0.263,0.416,0.557);

    // 使用余弦函数生成周期性颜色变化
    return a + b*cos( 6.28318*(c*t+d) );
}

/**
 * 主函数，生成分形图案和颜色效果
 * 通过迭代计算分形结构，并结合调色板函数生成视觉效果
 */
void main() {
    // 将屏幕坐标转换为归一化设备坐标(-1到1之间)
    vec2 uv = (gl_FragCoord.xy*2.-u_resolution.xy)/min(u_resolution.x,u_resolution.y);
  
    // 保存初始UV坐标用于颜色计算
    vec2 uv0 = uv;
    // 初始化最终颜色为黑色
    vec3 finalColor = vec3(0.0);
    
    // 进行4次迭代计算分形效果
    for (float i = 0.0; i < 4.0; i++) {
        // 对坐标进行缩放、取小数部分并偏移，创建分形效果
        uv = fract(uv * 1.5) - 0.5;

        // 计算当前点到中心的距离，并根据初始位置进行衰减
        float d = length(uv) * exp(-length(uv0));

        // 使用调色板函数根据位置、迭代次数和时间生成颜色
        vec3 col = palette(length(uv0) + i*.4 + u_time*.4);

        // 对距离值进行正弦变换，创建波纹效果
        d = sin(d*8. + u_time)/8.;
        // 取绝对值确保为正值
        d = abs(d);

        // 对距离值进行幂运算，增强对比度
        d = pow(0.01 / d, 1.2);

        // 将计算出的颜色和强度累加到最终颜色中
        finalColor += col * d;
    }
        
    // 输出最终颜色到片段
    gl_FragColor = vec4(finalColor, 1.0);
   
}